前幾天已經陸續完成資料品質檢查、缺失值處理、格式標準化、重複資料移除與數值異常處理。
不過,如果清理後的資料只能顯示在網頁上,使用者仍然無法直接將資料拿去做後續分析。
因此今天加入 CSV 匯出功能,讓使用者可以將清理後的資料下載到電腦,方便使用 Excel 或其他資料分析工具繼續處理。
一、建立export.php
首先,在專案資料夾中新增 export.php。
這個檔案負責讀取測試資料、套用清理規則,再將處理完成的資料輸出成 CSV 檔案。
二、讀取原始資料
首先指定要處理的CSV檔案:
$file = 'medical_data_test.csv';
if (!file_exists($file)) {
exit('找不到測試資料檔案。');
}
if (($handle = fopen($file, 'r')) === false) {
exit('無法讀取測試資料檔案。');
}
$header = fgetcsv($handle, 0, ',', '"', '');
這裡使用file_exists()確認檔案是否存在,再使用fopen()開啟檔案。
第一列是欄位名稱,因此另外存放在$header中,匯出時才能保留原本的欄位名稱。
三、套用資料清理規則
讀取每一筆資料時,先複製原始資料:
$cleanedRow = $row;
接著套用先前建立的清理規則。
if (trim($row[2]) === '') {
$cleanedRow[2] = 'Unknown';
}
如果 gender 是空白,就將清理後的值改成 Unknown。
2. 標準化性別格式
if ($row[2] === '男性' || $row[2] === 'M') {
$cleanedRow[2] = '男';
}
將不一致的性別表示方式統一為 男。
3. 標準化日期
if (preg_match('/^\d{4}\/\d{2}\/\d{2}$/', $row[8])) {
$cleanedRow[8] = str_replace('/', '-', $row[8]);
}
將使用斜線的日期格式轉換為使用連字號的格式,例如 2026/09/05 轉換為 2026-09-05。
4. 處理異常數值
($row[1] < 0 || $row[1] > 120)) {
$cleanedRow[1] = 'Unknown';
}
if (is_numeric($row[6]) &&
($row[6] < 30 || $row[6] > 200)) {
$cleanedRow[6] = 'Unknown';
}
如果年齡或心率超出本專案設定的測試範圍,就將對應欄位標記為 Unknown。
這些範圍是用來測試資料品質的規則,並不是醫療診斷標準。
四、移除重複資料
為了避免匯出的資料仍然包含重複項目,使用陣列記錄已經處理過的原始資料。
$signature = implode('|', $row);
if (isset($seenRows[$signature])) {
continue;
}
$seenRows[$signature] = true;
$rows[] = $cleanedRow;
這裡使 continue跳過後續完全相同的資料,只保留第一筆。
需要注意的是,目前的判斷方式是比對整筆資料是否完全相同,並不是依照病人編號刪除所有重複紀錄。
五、輸出 CSV 檔案
完成清理後,就可以將資料輸出成新的CSV檔案。
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="cleaned_medical_data.csv"');
$output = fopen('php://output', 'w');
fwrite($output, "\xEF\xBB\xBF");
fputcsv($output, $header);
foreach ($rows as $row) {
fputcsv($output, $row);
}
fclose($output);
exit;
這段程式有幾個重要功能:Content-Type:告訴瀏覽器輸出的是 CSV。Content-Disposition:讓瀏覽器以下載檔案的方式處理回應。php://output:將資料直接輸出給瀏覽器,不需要先建立暫存檔。fputcsv():將欄位正確寫成 CSV 格式。UTF-8 BOM:協助部分試算表軟體正確顯示中文。
下載的檔案名稱為 cleaned_medical_data.csv。
六、加入網頁下載連結
接著回到 index.php,加入下載連結:
echo '<h3>匯出清理後資料</h3>';
echo '<a href="export.php">下載清理後 CSV</a>';
這樣使用者就可以直接從網頁點擊連結,下載清理後的資料。
七、今天成果
目前的流程已經包含:
讀取 CSV->檢查資料品質->處理資料問題->記錄變更->預覽清理後資料->下載清理後 CSV